#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct Queue
{
    int data[MAXSIZE];
    int front, rear;
    int tag; // 0: 最近删除，1: 最近插入
} Queue;

// 初始化队列
void initQueue(Queue *q)
{
    q->front = q->rear = 0;
    q->tag = 0;
}

// 判断队列是否为空
int isEmpty(Queue *q)
{
    return (q->front == q->rear && q->tag == 0);
}

// 判断队列是否已满
int isFull(Queue *q)
{
    return (q->front == q->rear && q->tag == 1);
}

// 入队操作
int enqueue(Queue *q, int val)
{
    if (isFull(q))
    {
        printf("队列已满，无法插入元素 %d\n", val);
        return 0;
    }
    q->data[q->rear] = val;
    q->rear = (q->rear + 1) % MAXSIZE;
    q->tag = 1;
    return 1;
}

// 出队操作
int dequeue(Queue *q, int *val)
{
    if (isEmpty(q))
    {
        printf("队列为空，无法删除元素\n");
        return 0;
    }
    *val = q->data[q->front];
    q->front = (q->front + 1) % MAXSIZE;
    q->tag = 0;
    return 1;
}

// 修改队列中某个位置的值（按逻辑位置，第0个为队首）
int update(Queue *q, int pos, int newVal)
{
    if (isEmpty(q))
    {
        printf("队列为空，无法修改\n");
        return 0;
    }

    int len = (q->rear - q->front + MAXSIZE) % MAXSIZE;
    if (q->tag == 1 && q->front == q->rear)
        len = MAXSIZE; // 满队列

    if (pos < 0 || pos >= len)
    {
        printf("修改位置越界\n");
        return 0;
    }

    int idx = (q->front + pos) % MAXSIZE;
    q->data[idx] = newVal;
    return 1;
}

// 查看队列中某个位置的值（按逻辑位置）
int query(Queue *q, int pos, int *result)
{
    if (isEmpty(q))
    {
        printf("队列为空，无法查询\n");
        return 0;
    }

    int len = (q->rear - q->front + MAXSIZE) % MAXSIZE;
    if (q->tag == 1 && q->front == q->rear)
        len = MAXSIZE;

    if (pos < 0 || pos >= len)
    {
        printf("查询位置越界\n");
        return 0;
    }

    int idx = (q->front + pos) % MAXSIZE;
    *result = q->data[idx];
    return 1;
}

// 打印队列当前状态
void printQueue(Queue *q)
{
    if (isEmpty(q))
    {
        printf("队列为空\n");
        return;
    }

    printf("队列元素：[ ");
    int i = q->front;
    while (i != q->rear || (q->tag == 1 && q->front == q->rear))
    {
        printf("%d ", q->data[i]);
        i = (i + 1) % MAXSIZE;
        if (i == q->rear && q->tag != 1)
            break;
    }
    printf("]\n");
}
int main()
{
    Queue q;
    initQueue(&q);

    for (int i = 1; i <= 10; i++)
    {
        enqueue(&q, i * 10);
    }

    printQueue(&q);

    int val;
    dequeue(&q, &val);
    printf("出队元素：%d\n", val);

    printQueue(&q);

    update(&q, 2, 999);
    printQueue(&q);

    int queried;
    if (query(&q, 2, &queried))
    {
        printf("查询位置 2 的元素为：%d\n", queried);
    }

    return 0;
}
